package org.domain.sigepac.session;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.domain.sigepac.Utils;
import org.domain.sigepac.Entity.Aluno;
import org.domain.sigepac.Entity.CadastroReserva;
import org.domain.sigepac.Entity.CadastroReservaId;
import org.domain.sigepac.Entity.Curso;
import org.domain.sigepac.Entity.TipoCurso;
import org.domain.sigepac.Entity.Turma;
import org.domain.sigepac.home.EntityHomeSupport;
import org.domain.sigepac.repository.RepositorioAluno;
import org.domain.sigepac.repository.RepositorioCadastroReserva;
import org.domain.sigepac.repository.RepositorioCurso;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.international.StatusMessages;

@Name("alunoHome")
@Scope(ScopeType.CONVERSATION)
public class AlunoHome extends EntityHomeSupport<Aluno> {

	private static final long serialVersionUID = 1624266645825051326L;

	@In
	private StatusMessages statusMessages;

	@In
	private RepositorioAluno repositorioAluno;

	@In
	private RepositorioCadastroReserva repositorioCadastroReserva;

	private Curso curso= new Curso();
	private Turma turma=new Turma();
	private boolean reserva;

	@DataModel
	private Set<Turma> listaCursoTurmas;

	@DataModel
	private Set<CadastroReserva> listaAlunoCadastroReserva;

	private Set<CadastroReserva> reservas;

	public AlunoHome() {
		// TODO Auto-generated constructor stub
	}


	@Override
	protected Aluno createInstance() {
		Aluno aluno=new Aluno();
		return aluno;
	}

	@Factory("listaCursoTurmas")
	public void listaCursoTurmas(){
		listaCursoTurmas=getInstance().getTurmas();
	}

	@Factory("listaAlunoCadastroReserva")
	public void listaAlunoCadastroReserva(){
		listaAlunoCadastroReserva=getReservas();
	}

	public void salvar(){
		boolean check=false;

		if(!isManaged()){
			check=true;
		}

		repositorioAluno.inserirOuAtualizar(getInstance());
		if(check){
			for(CadastroReserva cadastroReserva:reservas){
				( (CadastroReservaId) cadastroReserva.getId()).setIdAluno((Integer)getInstance().getId());
				repositorioCadastroReserva.inserir(cadastroReserva);
			}
		}
		Utils.entityManagerFlush();
		createdMessage();
	}

	public boolean possoParticipar(){

		if(getInstance().getRendaFamiliar()==null || getInstance().getNumeroDependentes()==null)
			return false;

		int dependentes=1;
		double renda=0;
		if(isManaged()){
			dependentes=getInstance().getNumeroDependentes()+1;
			renda=getInstance().getRendaFamiliar();
		}

		if(renda/dependentes<=400)
			return true;
		return false;
	}

	@Begin(flushMode=FlushModeType.MANUAL,join=true)
	public void setIdAluno(Integer id) {
	    setId(id);

	 }

	public void adicionarTurma(){
		if(!isReserva()){
			if(getTurma().getId()!=null){
				getInstance().getTurmas().add(getTurma());
				listaCursoTurmas();
			}
		}
		else{
			CadastroReserva cadastroReserva=new CadastroReserva(getInstance(),getCurso());

			getReservas().add(cadastroReserva);
			listaAlunoCadastroReserva();
		}

		setCurso(new Curso());
		setTurma(new Turma());
		setReserva(false);

	}

	public void removerTurma(Turma turma){

		getInstance().getTurmas().remove(turma);
		listaCursoTurmas();
	}

	public void removerCadastroReserva(CadastroReserva cadastroReserva){
		getInstance().getCadastrosReserva().remove(cadastroReserva);
		listaAlunoCadastroReserva();
	}


	public List<Curso> listarCursosDisponiveis(){
		RepositorioCurso repositorioCurso = Utils.component("repositorioCurso");

		List<Curso> cursos=repositorioCurso.listar();
		cursos.removeAll(getInstance().getCursos());

		for(CadastroReserva cadastroReserva:getReservas()){
			cursos.remove(cadastroReserva.getCurso());
		}

		return cursos;
	}

	public Integer getIdAluno() {
	    return (Integer) getId();
	  }

	public void setTurma(Turma turma) {
		this.turma = turma;
	}
	public Turma getTurma() {
		return turma;
	}
	public void setCurso(Curso curso) {
		this.curso = curso;
	}
	public Curso getCurso() {
		return curso;
	}

	public void setReserva(boolean reserva) {
		this.reserva = reserva;
	}
	public boolean isReserva() {
		return reserva;
	}

	public TipoCurso getInclusaoDigital(){
		return TipoCurso.INCLUSAO_DIGITAL;
	}

	public Set<CadastroReserva> getReservas() {
		if(reservas==null){
			if(isManaged())
				reservas=getInstance().getCadastrosReserva();
			else
				reservas=new HashSet<CadastroReserva>();
		}
		return reservas;
	}

}
